import { app, BrowserWindow } from 'electron';
import { createMainWindow } from './window';
import { setupApplicationMenu, setupDockMenu } from './menu';
import { IPCHandlers } from './ipc/handlers';

let ipcHandlers: IPCHandlers | null = null;

/**
 * Electron 主进程入口文件
 * 负责应用生命周期管理和安全设置
 */

// 全局窗口引用
let mainWindow: BrowserWindow | null = null;

/**
 * 创建主窗口
 */
async function createWindow(): Promise<void> {
  try {
    console.log('开始创建主窗口...');
    
    // 初始化 IPC 处理器
    ipcHandlers = new IPCHandlers();
    ipcHandlers.registerHandlers();
    
    const window = await createMainWindow();
    mainWindow = window;
    
    // 设置应用菜单
    setupApplicationMenu(window);
    
    // 设置 Dock 菜单 (macOS)
    setupDockMenu();
    
    console.log('主窗口创建成功');
  } catch (error) {
    console.error('创建主窗口失败:', error);
    app.quit();
  }
}

/**
 * 应用准备就绪时的处理
 */
app.whenReady().then(async () => {
  console.log('Electron 应用准备就绪');
  
  // 设置应用安全策略
  app.setAboutPanelOptions({
    applicationName: 'Photos Plover Store',
    applicationVersion: app.getVersion(),
    copyright: '© 2024 Plover Store',
    website: 'https://plover.store'
  });
  
  await createWindow();
  
  // macOS 特定：当点击 dock 图标时重新创建窗口
  app.on('activate', async () => {
    if (BrowserWindow.getAllWindows().length === 0) {
      await createWindow();
    }
  });
});

/**
 * 所有窗口关闭时的处理
 */
app.on('window-all-closed', () => {
  console.log('所有窗口已关闭');
  
  // 在 macOS 上，除非用户用 Cmd + Q 确定地退出，
  // 否则绝大部分应用及其菜单栏会保持激活
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

/**
 * 应用退出前的清理工作
 */
app.on('before-quit', async (event) => {
  console.log('应用即将退出，执行清理工作...');
  
  if (ipcHandlers) {
    event.preventDefault();
    try {
      await ipcHandlers.cleanup();
      console.log('清理工作完成');
    } catch (error) {
      console.error('清理工作失败:', error);
    } finally {
      ipcHandlers = null;
      app.exit(0);
    }
  }
});

/**
 * 安全设置：限制新窗口的创建
 */
app.on('web-contents-created', (event, contents) => {
  // 阻止新窗口打开
  contents.setWindowOpenHandler(({ url }) => {
    console.log('阻止打开新窗口:', url);
    return { action: 'deny' };
  });
  
  // 阻止导航到外部链接
  contents.on('will-navigate', (event, navigationUrl) => {
    const parsedUrl = new URL(navigationUrl);
    
    // 只允许 file:// 协议和本地开发服务器
    if (parsedUrl.protocol !== 'file:' && !navigationUrl.startsWith('http://localhost')) {
      event.preventDefault();
      console.log('阻止导航到外部链接:', navigationUrl);
    }
  });
  
  // 阻止打开外部链接 (已废弃的事件，移除)
   // contents.on('new-window', (event, navigationUrl) => {
   //   event.preventDefault();
   //   console.log('阻止打开外部链接:', navigationUrl);
   // });
});

/**
 * 证书错误处理
 */
app.on('certificate-error', (event, webContents, url, error, certificate, callback) => {
  // 在开发环境中，可能需要忽略证书错误
  if (process.env.NODE_ENV === 'development') {
    // 警告但允许
    console.warn('证书错误 (开发环境):', error, url);
    event.preventDefault();
    callback(true);
  } else {
    // 生产环境中严格验证证书
    console.error('证书错误:', error, url);
    callback(false);
  }
});

/**
 * 处理未捕获的异常
 */
process.on('uncaughtException', (error) => {
  console.error('未捕获的异常:', error);
  
  // 在生产环境中，可能需要重启应用或显示错误对话框
  if (process.env.NODE_ENV === 'production') {
    app.quit();
  }
});

/**
 * 处理未处理的 Promise 拒绝
 */
process.on('unhandledRejection', (reason, promise) => {
  console.error('未处理的 Promise 拒绝:', reason, promise);
});

// 设置应用用户模型 ID (Windows)
if (process.platform === 'win32') {
  app.setAppUserModelId('com.plover.store.photos');
}